package com.gwc.schedule.controller;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;

public class BaseController extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String requestURI = req.getRequestURI();
        String[] split = requestURI.split("/");
        String methodName = split[split.length - 1];

        // 通过反射获取要执行的方法，getClass() 返回的是对象的实际类
        Class baseControllerClass = this.getClass();
        try {
            /*
            * baseControllerClass 是一个 Class 对象，代表了一个控制器类。
              getDeclaredMethod 是 Class 类的一个方法，用于获取该类声明的指定名称和参数类型的方法对象。
              methodName 是一个字符串，代表要获取的方法的名称。
              HttpServletRequest.class 和 HttpServletResponse.class 是该方法期望的参数类型，表明我们正在寻找一个接受
              * HttpServletRequest 和 HttpServletResponse 作为参数的方法。
            * */
            Method method = baseControllerClass.getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            // 强制方法可以访问
            /*
            * setAccessible 是 Method 类的一个方法，用于设置该方法是否可以被访问。
              如果目标方法是私有的（private），或者当前代码不在同一个包内且目标方法是包私有的（default 或 package-private），则通常需要通过反射来调用该方法时，
              * 需要先调用 setAccessible(true)。这样做会绕过Java的访问控制检查，使得私有方法也可以被访问和调用。
            * */
            method.setAccessible(true);
            // 通过反射执行代码
            /*
            * invoke 是 Method 类的一个方法，用于动态地调用该方法。
              this 是当前对象实例，表示要调用该方法的对象。
              req 和 resp 是实际传递给方法的参数，它们分别是 HttpServletRequest 和 HttpServletResponse 类型的对象。
            * */
            method.invoke(this,req,resp);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
